//package org.ricks.rpc.asm;
//
//import org.ricks.common.asm.*;
//import org.ricks.protocol.registration.IProtocolRegistration;
//
//import java.io.FileNotFoundException;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.lang.invoke.MethodHandles;
//import java.lang.reflect.Constructor;
//import java.lang.reflect.InvocationTargetException;
//import java.lang.reflect.Method;
//import java.util.Objects;
//
//import static org.ricks.common.asm.Opcodes.*;
//
//// 4. 客户端桩代码生成（ASM核心）
//public class StubGenerator {
//    public static <T> T generateStub(Class<T> serviceInterface) {
//        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
//        String className = serviceInterface.getName() + "Stub";
//        MethodHandles.Lookup lookup = MethodHandles.lookup();
//        // 类定义
//        cw.visit(V17, ACC_PUBLIC, className.replace('.', '/'),
//                null, Type.getInternalName(serviceInterface), null);
//
//        // 构造函数
//        MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
//        mv.visitCode();
//        mv.visitVarInsn(ALOAD, 0);
//        mv.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(serviceInterface), "<init>", "()V", false);
//
//        mv.visitInsn(RETURN);
//        mv.visitMaxs(1, 1);
//        mv.visitEnd();
//
//        // 方法生成
//        for (Method method : serviceInterface.getDeclaredMethods()) {
//            RpcMethod rpcMethod = method.getAnnotation(RpcMethod.class);
//            if(Objects.isNull(rpcMethod)) continue;
//            generateProxyMethod(cw, serviceInterface, method);
//        }
//
//        byte[] bytecode = cw.toByteArray();
//        try {
//            FileOutputStream fos = new FileOutputStream("d://rpc.class");
//            fos.write(bytecode);
//            fos.close();
//            return (T) new ByteClassLoader().defineClass(className, bytecode)
//                    .getConstructor().newInstance();
//
//        } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException | IOException e) {
//            throw new RuntimeException(e);
//        }
//    }
//
//    private static void generateProxyMethod(ClassWriter cw, Class<?> serviceClass, Method method) {
//        String descriptor = Type.getMethodDescriptor(method);
//        MethodVisitor mv = cw.visitMethod(
//                Opcodes.ACC_PUBLIC,
//                method.getName(),
//                descriptor,
//                null,
//                null);
//
//        mv.visitCode();
//
//        try {
//            // 参数索引起始：非静态方法第一个参数是this（索引0）
//            int paramCount = method.getParameterCount();
//            int localVarIndex = paramCount + 1; // 参数+this后的起始位置
//
//            // ----------- 网络调用核心逻辑 -----------
//            // 1. 创建Socket连接
//            mv.visitTypeInsn(Opcodes.NEW, "java/net/Socket");
//            mv.visitInsn(Opcodes.DUP);
//            mv.visitLdcInsn("localhost");
//            mv.visitIntInsn(Opcodes.SIPUSH, 8080);
//            mv.visitMethodInsn(
//                    Opcodes.INVOKESPECIAL,
//                    "java/net/Socket",
//                    "<init>",
//                    "(Ljava/lang/String;I)V");
//            mv.visitVarInsn(Opcodes.ASTORE, localVarIndex); // 存储Socket对象到局部变量
//
//            // 2. 创建输出流
//            mv.visitVarInsn(Opcodes.ALOAD, localVarIndex);
//            mv.visitMethodInsn(
//                    Opcodes.INVOKEVIRTUAL,
//                    "java/net/Socket",
//                    "getOutputStream",
//                    "()Ljava/io/OutputStream;");
//            mv.visitTypeInsn(Opcodes.NEW, "java/io/DataOutputStream");
//            mv.visitInsn(Opcodes.DUP_X1); // 调整栈结构为 [OutputStream, uninitialized, uninitialized]
//            mv.visitInsn(Opcodes.SWAP);    // 变为 [uninitialized, OutputStream, uninitialized]
//            mv.visitMethodInsn(
//                    Opcodes.INVOKESPECIAL,
//                    "java/io/DataOutputStream",
//                    "<init>",
//                    "(Ljava/io/OutputStream;)V");
//            mv.visitVarInsn(Opcodes.ASTORE, localVarIndex + 1); // 存储输出流
//
//            // 3. 发送请求协议头
//            mv.visitVarInsn(Opcodes.ALOAD, localVarIndex + 1);
//            mv.visitLdcInsn(0xCAFEBABE); // magic number
//            mv.visitMethodInsn(
//                    Opcodes.INVOKEVIRTUAL,
//                    "java/io/DataOutputStream",
//                    "writeInt",
//                    "(I)V");
//
//            // 4. 创建输入流读取响应
//            mv.visitVarInsn(Opcodes.ALOAD, localVarIndex); // 重新加载Socket
//            mv.visitMethodInsn(
//                    Opcodes.INVOKEVIRTUAL,
//                    "java/net/Socket",
//                    "getInputStream",
//                    "()Ljava/io/InputStream;");
//            mv.visitTypeInsn(Opcodes.NEW, "java/io/DataInputStream");
//            mv.visitInsn(Opcodes.DUP_X1);
//            mv.visitInsn(Opcodes.SWAP);
//            mv.visitMethodInsn(
//                    Opcodes.INVOKESPECIAL,
//                    "java/io/DataInputStream",
//                    "<init>",
//                    "(Ljava/io/InputStream;)V");
//            mv.visitVarInsn(Opcodes.ASTORE, localVarIndex + 2); // 存储输入流
//
//            // 5. 读取响应结果（模拟）
//            mv.visitVarInsn(Opcodes.ALOAD, localVarIndex + 2);
//            mv.visitMethodInsn(
//                    Opcodes.INVOKEVIRTUAL,
//                    "java/io/DataInputStream",
//                    "readInt",
//                    "()I");
//
//            // 确保栈顶有返回结果
//            mv.visitInsn(Opcodes.IRETURN); // 针对int返回类型
//
//        } finally {
//            // 关键是正确设置max stack和locals
//            mv.visitMaxs(0, 0); // 由ASM自动计算
//            mv.visitEnd();
//        }
//    }
//
//
//
//    static class ByteClassLoader extends ClassLoader {
//        public Class<?> defineClass(String name, byte[] code) {
//            return defineClass(name, code, 0, code.length);
//        }
//    }
//}